/* class BHXJGLTTF
 * 冰河洗剑 2020.4.17
 * 将字形数据纳入到自定义的模型框架中（见bhxjglmodel.h）
 *
 * 冰河洗剑 2020.4.15
 * 增加一个Paint重载以适应不同的情况
 * 删除shader成员，改为绘制时指定shader程序
 *
 * 冰河洗剑 2020.4.2
 * 取出ttf字形数据并转化为三角形绘制
 * 利用stb_truetype和libtess2库
 *
*/

#ifndef BHXJGLTTF_H
#define BHXJGLTTF_H
#include<stb/stb_truetype.h>
#include<QFile>
#include<QByteArray>
#include<libtess2/tess.h>
#include <map>
#include <vector>
#include <tuple>
#include <list>
#include "bhxjglshader.h"
#include "bhxjglmodel.h"

#include "bhxjglinclude.h"
#include "BHXJControls_global.h"

/////存储字形数据的opengl缓存

///用来处理ttf字型的Mesh类
class BHXJCONTROLS_EXPORT BHXJGLTTFMesh:public BHXJGLMesh
{
public:

    BHXJGLTTFMesh();
    virtual ~BHXJGLTTFMesh();
    //字宽
    int Advance;
    //字形左侧距离
    int Lsb;
protected:

};


class BHXJCONTROLS_EXPORT BHXJGLTTF
{
    // 0 字形数据指正 1 起始位置（字体原坐标单位）
    typedef std::tuple<BHXJGLTTFMesh*,float> helpdatam;

public:
    BHXJGLTTF();
    virtual ~BHXJGLTTF();

    void Init(BHXJGLFUN *g,const QString& path);

    void PaintString(const QString &str,const glm::mat4 &projection,const glm::mat4 &view,const glm::mat4 &model,BHXJGLShader *shader);
    void PaintString(const QString &str,const BHXJGLPaintParam & p,BHXJGLShader *shader);

    void addTextToMesh(BHXJGLTTFMesh *const m,const unsigned short &unicode,const glm::mat4 &model);

protected:
    BHXJGLFUN *gl=nullptr;
    //BHXJGLShader *shader=nullptr;
    stbtt_fontinfo *fontinfo;
    float fontheight=100;
    int descent = 0;
    QByteArray *bytes=nullptr;

    std::map<unsigned short,BHXJGLTTFMesh*> *ttfmeshes;

    void PaintMesh(const QString &str,const glm::mat4 &projection,const glm::mat4 &view,const glm::mat4 &model,BHXJGLShader *shader);

    BHXJGLTTFMesh* getMesh(const unsigned short &unicode);


    void clearshape();

    void addTextStripe(BHXJGLMesh *m,std::vector<glm::vec2> &cache,const glm::mat4 &mat4);
    void addTessPolygon(TESStesselator *tess,const std::vector<glm::vec2> &cache);

    void getBezierPoint(glm::vec2 &ret, glm::vec2 &previous,glm::vec2 &contrl,glm::vec2 &current,float  scale);
    int getBezierPoint_stbttf(std::vector<glm::vec2> &cache, float x0, float y0, float x1, float y1, float x2, float y2, float objspace_flatness_squared, int n);


};

#endif // BHXJGLTTF_H
